import axios from 'axios';
import { useUserStore } from '../store/user'; // 导入 user store
import router from '../router'; // 导入 router 以便重定向
import { ElMessage } from 'element-plus'; // 用于显示错误信息

// 后端 API 基础 URL
const API_BASE_URL = 'http://localhost:8080/api';

// 创建 Axios 实例
const axiosInstance = axios.create({
    baseURL: API_BASE_URL,
    timeout: 10000, // 请求超时时间
});

// 请求拦截器
axiosInstance.interceptors.request.use(
    (config) => {
        // 在发送请求之前做些什么
        const userStore = useUserStore();
        const token = userStore.token; // 从 Pinia store 获取 token

        if (token) {
            // 让每个请求携带自定义 token 请根据实际情况自行修改
            config.headers.Authorization = `Bearer ${token}`;
        }
        return config;
    },
    (error) => {
        // 对请求错误做些什么
        console.error('Request Error:', error);
        return Promise.reject(error);
    }
);

// 响应拦截器
axiosInstance.interceptors.response.use(
    (response) => {
        // 对响应数据做点什么
        // 可以直接返回 response.data，如果后端接口结构统一的话
        return response;
    },
    (error) => {
        // 对响应错误做点什么
        console.error('Response Error:', error);
        const userStore = useUserStore();

        // 添加自定义标记，表示错误已经被处理过
        if (error.config && error.config._errorHandled) {
            return Promise.reject(error);
        }

        if (error.response) {
            // 标记错误已被处理
            if (error.config) {
                error.config._errorHandled = true;
            }

            switch (error.response.status) {
                case 401: // 未授权 (例如 token 过期或无效)
                    // 如果是修改密码请求导致的401，则不处理，让组件自己处理
                    if (error.config && error.config.url && error.config.url.includes('/users/profile/change-password')) {
                         console.log('Change password 401 error, handled by component.');
                         break; // 跳出 switch，不执行下面的登出逻辑
                    }
                    // 如果不是在登录页面发生的 401，则执行登出并跳转到登录页
                    if (router.currentRoute.value.name !== 'Login') {
                        ElMessage.error('认证已过期或无效，请重新登录');
                        userStore.logout(); // 调用 store 的 logout action
                        router.push({ name: 'Login' }); // 跳转到登录页
                    }
                    break;
                case 403: // 禁止访问
                    ElMessage.error('您没有权限执行此操作');
                    break;
                case 404: // 未找到资源
                    ElMessage.error('请求的资源未找到');
                    break;
                // 可以根据需要添加更多状态码的处理
                default:
                    // 显示后端返回的错误信息（如果存在）
                    // 注意：在Admin.vue中的场次管理部分，我们会自己处理错误消息，所以这里不显示
                    if (error.config && error.config.url &&
                        (error.config.url.includes('/admin/showtimes') ||
                         error.config.url.includes('/showtimes'))) {
                        // 不显示错误消息，让组件自己处理
                        console.log('场次相关错误，由组件自行处理');
                    } else {
                        ElMessage.error(error.response.data?.error || error.response.data?.message || '请求失败');
                    }
            }
        } else if (error.request) {
            // 请求已发出，但没有收到响应
            ElMessage.error('网络错误，请检查您的连接');
        } else {
            // 发送请求时出了点问题
            ElMessage.error('请求发送失败');
        }

        return Promise.reject(error);
    }
);

export default axiosInstance;